package com.sogoodsoft.entity.crm;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import com.sogoodsoft.entity.IdEntity;
import com.sogoodsoft.entity.account.User;
import com.sogoodsoft.entity.app.SysClass;

/**
 * SMSTASK对象模型
 */
@Entity
@Table(name = "SMSTASK")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Smstask extends IdEntity implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    /** 本字段只有像征意义，实际的发送目标存在SMS表中，用TARGETID关联 */
    private String target;

    /** 短信内容 */
    private String msg;

    /** 发送短信的当前用户 */
    private Long userid;
    private String username;
    /** 发送类型：日程提醒、客户生日、本公司员工生日、订单通知、节日祝贺、公司通知、个人发送、其它 */
    private Long smstype;

    /** 来源ID，按类型关联ID，订单的关联订单ID，日程的关联日程ID，客户生日的关联客户ID，类推 */
    private Long sourceid;

    /** 设定的发送日期和时间 */
    private Date plantime;

    /** 是否已处理 */
    private Long done;

    /** 最后更新时间 */
    private Date updatedate;

    private List < Sms > smsList;

    private SysClass type;

    private SysClass status;



    /** 发送类型的系统编码 */
    public enum SEND_TYPE_CODE {
        // 日程提醒
        ALERT("COMM_SEND_TYPE_ALERT"),

        // 客户生日
        CUSTOM_BIRTHDAY("COMM_SEND_TYPE_CUSBIRTHDAY"),

        // 本公司员工生日
        BIRTHDAY("COMM_SEND_TYPE_BIRTHDAY"),

        // 订单通知
        ORDER("COMM_SEND_TYPE_ORDER"),

        // 节日祝贺
        HOLIDAY("COMM_SEND_TYPE_HOLIDAY"),

        // 公司通知
        COMPANY("COMM_SEND_TYPE_COMPANY"),

        // 个人发送
        SELF("COMM_SEND_TYPE_SELF"),
        
        // 预约提醒
        DATE("COMM_SEND_TYPE_SELF"),

        // 其它
        OTHER("COMM_SEND_TYPE_OTHER");

        private String CODE = "";

        private SEND_TYPE_CODE(String code) {
            this.CODE = code;
        }

        public String getCODE() {
            return CODE;
        }

    }

    /** 发送状态的系统编码 */
    public enum SEND_STATUS_CODE {
        // 日程提醒
        SUCCESS("COMM_STATUS_SUCCESS"), FAIL("COMM_STATUS_FAILD"), WAIT("COMM_STATUS_WAIT"), FINISH(
                "COMM_STATUS_FINISH");

        private String CODE = "";

        private SEND_STATUS_CODE(String code) {
            this.CODE = code;
        }

        public String getCODE() {
            return CODE;
        }

    }

    /**
     * 获取本字段只有像征意义，实际的发送目标存在SMS表中，用TARGETID关联
     * 
     * @return 本字段只有像征意义，实际的发送目标存在SMS表中，用TARGETID关联
     */
    @Transient
    public String getTarget() {
        return this.target;
    }

    /**
     * 设置本字段只有像征意义，实际的发送目标存在SMS表中，用TARGETID关联
     * 
     * @param target
     *            本字段只有像征意义，实际的发送目标存在SMS表中，用TARGETID关联
     */
    public void setTarget(String target) {
        this.target = target;
    }

    /**
     * 获取短信内容
     * 
     * @return 短信内容
     */
    @Column(name = "MSG")
    public String getMsg() {
        return this.msg;
    }

    /**
     * 设置短信内容
     * 
     * @param msg
     *            短信内容
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     * 获取发送短信的当前用户
     * 
     * @return 发送短信的当前用户
     */
    @Column(name = "USERID")
    public Long getUserid() {
        return this.userid;
    }

    /**
     * 设置发送短信的当前用户
     * 
     * @param userid
     *            发送短信的当前用户
     */
    public void setUserid(Long userid) {
        this.userid = userid;
    }

    @Column(name = "USERNAME")
    public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	/**
     * 获取发送类型：日程提醒、客户生日、本公司员工生日、订单通知、节日祝贺、公司通知、个人发送、其它
     * 
     * @return 发送类型：日程提醒、客户生日、本公司员工生日、订单通知、节日祝贺、公司通知、个人发送、其它
     */
    @Column(name = "SMSTYPE", insertable = false, updatable = false)
    public Long getSmstype() {
        return this.smstype;
    }

    /**
     * 设置发送类型：日程提醒、客户生日、本公司员工生日、订单通知、节日祝贺、公司通知、个人发送、其它
     * 
     * @param smstype
     *            发送类型：日程提醒、客户生日、本公司员工生日、订单通知、节日祝贺、公司通知、个人发送、其它
     */
    public void setSmstype(Long smstype) {
        this.smstype = smstype;
    }

    /**
     * 获取来源ID，按类型关联ID，订单的关联订单ID，日程的关联日程ID，客户生日的关联客户ID，类推
     * 
     * @return 来源ID，按类型关联ID，订单的关联订单ID，日程的关联日程ID，客户生日的关联客户ID，类推
     */
    @Column(name = "SOURCEID")
    public Long getSourceid() {
        return this.sourceid;
    }

    /**
     * 设置来源ID，按类型关联ID，订单的关联订单ID，日程的关联日程ID，客户生日的关联客户ID，类推
     * 
     * @param sourceid
     *            来源ID，按类型关联ID，订单的关联订单ID，日程的关联日程ID，客户生日的关联客户ID，类推
     */
    public void setSourceid(Long sourceid) {
        this.sourceid = sourceid;
    }

    /**
     * 获取设定的发送日期和时间
     * 
     * @return 设定的发送日期和时间
     */
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "PLANTIME")
    public Date getPlantime() {
        if (plantime == null)
            plantime = new Date();
        return this.plantime;
    }

    /**
     * 设置设定的发送日期和时间
     * 
     * @param plantime
     *            设定的发送日期和时间
     */
    public void setPlantime(Date plantime) {
        this.plantime = plantime;
    }

    /**
     * 获取是否已处理
     * 
     * @return 是否已处理
     */
    @Column(name = "DONE", insertable = false, updatable = false)
    public Long getDone() {
        return this.done;
    }

    /**
     * 设置是否已处理
     * 
     * @param done
     *            是否已处理
     */
    public void setDone(Long done) {
        this.done = done;
    }

    @OneToMany(mappedBy = "task", cascade = {})
    @OrderBy("id asc")
    public List < Sms > getSmsList() {
        return smsList;
    }

    public void setSmsList(List < Sms > smsList) {
        this.smsList = smsList;
    }

    @ManyToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, optional = true)
    @JoinColumn(name = "SMSTYPE")
    public SysClass getType() {
        return type;
    }

    public void setType(SysClass type) {
        this.type = type;
    }

    @ManyToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, optional = true)
    @JoinColumn(name = "DONE")
    public SysClass getStatus() {
        return status;
    }

    public void setStatus(SysClass status) {
        this.status = status;
    }

    /**
     * 获取最后更新时间
     * 
     * @return 最后更新时间
     */
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "UPDATEDATE")
    public Date getUpdatedate() {
        if (updatedate == null)
            updatedate = new Date();
        return this.updatedate;
    }

    /**
     * 设置最后更新时间
     * 
     * @param updatedate
     *            最后更新时间
     */
    public void setUpdatedate(Date updatedate) {
        this.updatedate = updatedate;
    }

}